package com.lg.algorithm.collections.list;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
/**

 arrayList
 增加
 指定位置增加，不是覆盖，当前位置的元素，向后移动。若目标位置没有东西，IndexOutOfBoundsException
 获取指定位置上的元素
 身上有数字和链表的功能

 底层数据结构
 array

 初始化大小多少
 默认容量是0。可以指定大小，不能为负数，负数报错

 大小有限制么，是多少
 integer.max_value

 怎么扩容的，扩容的整个过程是怎么样的
 默认容量是0
 当增加元素的时候
 数字为空的时候 值得10，数组不为空的时候 值为size+1
 上面这个值要是比数组长度大
 带着这个值进行扩容
 新的容量为原来数字长度的1.5倍
 新容量和上面的值比 谁大要谁
 新容量过大时有限制  integer.max_value
 建立一个新容量的数组，并将原来的数组元素拷贝过去
 说人话：
 一开始数组为空，增加一个元素数字容量为10，容量即为数字开辟的空间大小
 当size+1大于容量（10） 的时候开始扩容，容量为原来的1.5倍
 也就是第11个元素开始扩容，容量为15
 第16个元素开始扩容，容量为22

 减少会缩容么
 不会。 会缩减元素，不会缩减容量。数字重新指向一个copy的新数组，这个数字的元素变少了，但这个数组的长度没有变换。

 线程不安全怎么办
 collections.synchronized
 synchronized 锁自己这个这个对象
 读写全加锁
 copyOnWriteArrayList
 reentrantLock  cas
 写加锁，读不加锁


 */
public class ArrayListTest {
    public static void main(String[] args) {
        ArrayList<String> arrayList = new ArrayList<String>( );
        arrayList.add("1");
        arrayList.add("2");
        arrayList.add("3");
        arrayList.add("4");
        arrayList.add("5");
        arrayList.add("6");
        arrayList.add("7");
        arrayList.add("8");
        arrayList.add("9");
        arrayList.add("10");
        arrayList.add("11");
        arrayList.add("12");
        arrayList.add("14");
        arrayList.add("15");
        arrayList.add("16");
        arrayList.add("17");

        arrayList.remove(1);
        arrayList.remove(2);
        arrayList.remove(3);

        List<String> strings = Collections.synchronizedList(arrayList);
        strings.add("ff");

        strings.get(1);

        CopyOnWriteArrayList<Object> objects = new CopyOnWriteArrayList<>();
        objects.add("bb");
        objects.get(1);
        objects.remove(1);

    }
}
